package com.duobao.service.impl;

import cn.hutool.core.lang.UUID;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.duobao.entity.dto.UserInfoDTO;
import com.duobao.entity.pojo.UserInfo;
import com.duobao.entity.vo.Result;
import com.duobao.entity.vo.ResultCodeEnum;
import com.duobao.entity.vo.UserInfoVO;
import com.duobao.mapper.UserInfoMapper;
import com.duobao.service.IUserInfoService;
import com.duobao.utils.VerificationCodeUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author c_shunyi
 * @since 2024-07-21
 */
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements IUserInfoService {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;


    @Override
    public Boolean sendCode(String mobile) {
        // 生成随机6为数字
        Random random = new Random();

        // 生成一个0-999999之间的随机数
        // 然后将其转换为字符串并格式化，以确保它始终是6位数字
        // 如果生成的数小于6位，我们在前面补0
        String code = String.format("%06d", random.nextInt(1000000));
        // 存入redis,过期时间为60秒
        redisTemplate.opsForValue().set("VerificationCode:"+mobile, code, 60, TimeUnit.SECONDS);
        // 发送验证码
        System.out.println(mobile);
        return VerificationCodeUtils.sendVerificationCode(mobile,code);
    }

    @Override
    public Result register(UserInfoDTO userInfoDTO) {
        // 1. 校验用户名是否存在
        if (getOne(new QueryWrapper<UserInfo>().eq("mobile",userInfoDTO.getMobile()),false) != null){
            return Result.error(null, ResultCodeEnum.USER_NAME_IS_EXISTS);
        }
        // 2. 校验验证码
        String code = redisTemplate.opsForValue().get("VerificationCode:"+userInfoDTO.getMobile());
        if(code == null){
            return Result.error(null, ResultCodeEnum.VALIDATECODE_EXPIRED);
        }else{
            if(!code.equals(userInfoDTO.getCode())){
                return Result.error(null, ResultCodeEnum.VALIDATECODE_ERROR);
            }
        }
        // 删除验证码
        redisTemplate.delete("VerificationCode:"+userInfoDTO.getMobile());

        // 3. 注册
        UserInfo userInfo = new UserInfo();
        userInfo.setMobile(userInfoDTO.getMobile());
        userInfo.setPassword(userInfoDTO.getPassword());
        save(userInfo);
        return Result.success(null, ResultCodeEnum.SUCCESS);
    }

    @Override
    public Result login(UserInfoDTO userInfoDTO) {

        UserInfo userInfo = getOne(new QueryWrapper<UserInfo>()
                        .eq("mobile", userInfoDTO.getMobile())
                        .eq("type", 0)
                , false);
        if (userInfo == null) {
            return Result.error(null, ResultCodeEnum.MASSAGE_ERROR);
        }
        if (!userInfo.getPassword().equals(userInfoDTO.getPassword())){
            return Result.error(null, ResultCodeEnum.PASSWORD_ERROR);
        }
        return Result.success(getUserInfoVO(userInfo), ResultCodeEnum.SUCCESS);
    }

    /**
     * 登录成功后，把用户信息放到redis里面
     * @param userInfo 用户信息
     * @return userInfoVO 返回用户信息带token
     */
    private UserInfoVO getUserInfoVO(UserInfo userInfo) {
        //如果密码一致则登录成功，生成token
        String token = UUID.randomUUID().toString().replaceAll("-", "");

        // 登录成功后，把用户信息放到redis里面
        redisTemplate.opsForValue().set("userInfo:" + token,
                JSON.toJSONString(userInfo),
                7,
                TimeUnit.DAYS
        );
        UserInfoVO userInfoVO = new UserInfoVO();
        BeanUtils.copyProperties(userInfo, userInfoVO);
        userInfoVO.setToken(token);
        return userInfoVO;
    }

    @Override
    public Result loginByMobile(UserInfoDTO userInfoDTO) {
        boolean status = false;
        // 1. 校验验证码
        String code = redisTemplate.opsForValue().get("VerificationCode:"+userInfoDTO.getMobile());
        if(code == null){
            return Result.error(null, ResultCodeEnum.VALIDATECODE_EXPIRED);
        }else{
            if(!code.equals(userInfoDTO.getCode())){
                return Result.error(null, ResultCodeEnum.VALIDATECODE_ERROR);
            }
        }
        UserInfo userInfo = getOne(new QueryWrapper<UserInfo>()
                        .eq("mobile", userInfoDTO.getMobile())
                        .eq("type", 0)
                , false);
        if (userInfo != null){
            return Result.error(getUserInfoVO(userInfo), ResultCodeEnum.SUCCESS);
        }else{
            // 插入数据
            status = save(new UserInfo().setMobile(userInfoDTO.getMobile()));
            if (status){
                UserInfo info = getOne(new QueryWrapper<UserInfo>().eq("mobile", userInfoDTO.getMobile()), false);
                return Result.success(getUserInfoVO(info), ResultCodeEnum.SUCCESS);
            }else {
                return Result.error(null, ResultCodeEnum.DATA_ERROR);
            }
        }

    }

    @Override
    public Result adminLogin(UserInfoDTO userInfoDTO) {
        UserInfo userInfo = getOne(new QueryWrapper<UserInfo>()
                .eq("mobile", userInfoDTO.getMobile())
                .eq("type", 1), false);

        //  校验用户名是否存在
        if (userInfo == null){
            return Result.error(null, ResultCodeEnum.MASSAGE_ERROR);
        }
        // 校验密码
        if (!userInfo.getPassword().equals(userInfoDTO.getPassword())){
            return Result.error(null, ResultCodeEnum.PASSWORD_ERROR);
        }
        userInfo.setPassword(null);
        return Result.success(userInfo, ResultCodeEnum.SUCCESS);
    }

    @Override
    public Result adminLoginByMobile(UserInfoDTO userInfoDTO) {

        UserInfo userInfo = getOne(new QueryWrapper<UserInfo>()
                        .eq("mobile", userInfoDTO.getMobile())
                        .eq("type", 1)
                , false);
        if (userInfo == null) {
            return Result.error(null, ResultCodeEnum.MASSAGE_ERROR);
        }

        // 校验验证码
        String code = redisTemplate.opsForValue().get("VerificationCode:"+userInfoDTO.getMobile());
        if(code == null){
            return Result.error(null, ResultCodeEnum.VALIDATECODE_EXPIRED);
        }
        if(!code.equals(userInfoDTO.getCode())){
            return Result.error(null, ResultCodeEnum.VALIDATECODE_ERROR);
        }
        // 删除验证码
        redisTemplate.delete("VerificationCode:"+userInfoDTO.getMobile());
        userInfo.setPassword(null);
        return Result.success(userInfo, ResultCodeEnum.SUCCESS);
    }
}



